/**
 * 属性协议
 * 
 * 该协议定义了属性面板的配置和交互方式，包括各种属性编辑器和数据绑定功能。
 */

import type { PropType, ModelField } from '@/types';

/**
 * 基础属性设置器接口
 */
export interface BasePropSetter<T = unknown> {
  type: PropType | string;       // 设置器类型
  label: string;                 // 设置器标签
  name: string;                  // 属性名称
  value: T;                      // 当前值
  defaultValue?: T;              // 默认值
  required?: boolean;            // 是否必填
  disabled?: boolean;            // 是否禁用
  tooltip?: string;              // 提示信息
  placeholder?: string;          // 占位文本
  onChange: (value: T) => void;  // 值变更回调
}

/**
 * 字符串属性设置器
 */
export interface StringPropSetter extends BasePropSetter<string> {
  type: PropType.STRING;
  minLength?: number;          // 最小长度
  maxLength?: number;          // 最大长度
  pattern?: string;            // 正则表达式
  multiline?: boolean;         // 是否多行
  rows?: number;               // 多行文本行数
}

/**
 * 数字属性设置器
 */
export interface NumberPropSetter extends BasePropSetter<number> {
  type: PropType.NUMBER;
  min?: number;                // 最小值
  max?: number;                // 最大值
  step?: number;               // 步长
  precision?: number;          // 精度(小数位数)
  slider?: boolean;            // 是否显示滑块
}

/**
 * 布尔属性设置器
 */
export interface BooleanPropSetter extends BasePropSetter<boolean> {
  type: PropType.BOOLEAN;
  trueText?: string;           // true值文本
  falseText?: string;          // false值文本
}

/**
 * 选项接口
 */
export interface SelectOption {
  label: string;               // 选项标签
  value: string | number | boolean; // 选项值
  disabled?: boolean;          // 是否禁用
}

/**
 * 选择属性设置器
 */
export interface SelectPropSetter extends BasePropSetter<string | number | boolean> {
  type: PropType.SELECT;
  options: SelectOption[];     // 选项列表
  mode?: 'multiple' | 'tags';  // 选择模式
  showSearch?: boolean;        // 是否可搜索
  allowClear?: boolean;        // 是否可清除
}

/**
 * 颜色属性设置器
 */
export interface ColorPropSetter extends BasePropSetter<string> {
  type: PropType.COLOR;
  format?: 'hex' | 'rgb' | 'hsl'; // 颜色格式
  showAlpha?: boolean;         // 是否显示透明度
  presetColors?: string[];     // 预设颜色
}

/**
 * 日期属性设置器
 */
export interface DatePropSetter extends BasePropSetter<string | Date> {
  type: PropType.DATE;
  format?: string;             // 日期格式
  showTime?: boolean;          // 是否显示时间
  disabledDate?: (date: Date) => boolean; // 禁用日期函数
}

/**
 * 模型字段属性设置器
 */
export interface ModelFieldPropSetter extends BasePropSetter<string> {
  type: PropType.MODEL_FIELD;
  modelName: string;           // 模型名称
  fields: ModelField[];        // 可选字段列表
}

/**
 * 联合类型，包含所有属性设置器
 */
export type PropSetter = 
  | StringPropSetter
  | NumberPropSetter
  | BooleanPropSetter
  | SelectPropSetter
  | ColorPropSetter
  | DatePropSetter
  | ModelFieldPropSetter;

/**
 * 属性分组
 */
export interface PropGroup {
  title: string;               // 分组标题
  key: string;                 // 唯一键名
  expanded?: boolean;          // 是否展开
  setters: PropSetter[];       // 设置器列表
}

/**
 * 属性面板配置
 */
export interface PropertyPanelConfig {
  groups: PropGroup[];         // 属性分组
  componentId: string;         // 当前编辑的组件ID
  componentType: string;       // 当前编辑的组件类型
}

/**
 * 数据绑定接口
 */
export interface DataBinding {
  propName: string;            // 绑定的组件属性
  bindingType: 'model' | 'state' | 'computed'; // 绑定类型
  source: string;              // 数据源路径，如：model.book.title
  transform?: string;          // 数据转换表达式
}

/**
 * 组件类型定义
 */
export interface ComponentInstance {
  id: string;
  type: string;
  props: Record<string, unknown>;
  children?: string[];
}

/**
 * 属性面板上下文
 */
export interface PropertyPanelContext {
  config: PropertyPanelConfig; // 面板配置
  component: ComponentInstance; // 当前组件实例
  updateProps: (props: Record<string, unknown>) => void; // 更新属性方法
  addDataBinding: (binding: DataBinding) => void; // 添加数据绑定
  removeDataBinding: (propName: string) => void;  // 移除数据绑定
  getAvailableModels: () => { name: string; fields: ModelField[] }[]; // 获取可用模型
} 